home *** CD-ROM | disk | FTP | other *** search
/ Network Supervisor's Toolkit / Network Supervisor's Toolkit.iso / tools / lu62 / phsrec.c < prev    next >
C/C++ Source or Header  |  1996-07-10  |  7KB  |  237 lines

  1.  /********************************************************
  2.  *                                                       *
  3.  *         Process RECords from HS                       *
  4.  *                                                       *
  5.  *  This subroutine will be invoked upon receiving the   *
  6.  *  FMH-5 or FMH-7 records.                              *
  7.  *                                                       *
  8.  * INPUT : pointer to "segprf" structure.                *
  9.  *                                                       *
  10.  * CopyRight 1995. Nicholas Poljakov all rights reserved.*
  11.  *                                                       *
  12.  ********************************************************/
  13. #include <stdio.h>
  14. #include <malloc.h>
  15. #include <fmhcom.h>
  16. #include <fmh7.h>
  17. #include <scb.h>
  18. #include <rcb.h>
  19. #include <lucb.h>
  20. #include <psp.h>
  21. #include <include.h>
  22. #include <rpl.h>
  23. #include <string.h>
  24. #include <state1.h>
  25.  
  26. #define TYPE5 5
  27. #define TYPE7 7
  28.  
  29. struct psp psp_ini;
  30. int sk_r_wt(void *);
  31. int SendBlock(void *, void *);
  32. int setrc(void *, void *);
  33. int sendhsf(void *);
  34. int sendhs(void *);
  35. int sendbm(void *, void *);
  36. int sendat(void *);
  37. int rtsend(void *);
  38. unsigned long rmfmh5(void *, void *);
  39. int recwait(void *);
  40. int rcvru(void *, void *);
  41. int rcvhs(void *, void *, void *, void *);
  42. int ralloc(void *, void *);
  43. int psrm(int, void *, void *);
  44. int ps_conv(int, void *);
  45. int proterr(void *, unsigned long);
  46. int preptrcv(void *, void *);
  47. int post_rcb(void *);
  48. struct repass *postopen(void *);
  49. int pfmh5(void *);
  50. int opndst(void *);
  51. int obtsess(void *, unsigned char);
  52. int Lrf_handler(void *);
  53. int get_sess(void *, void *);
  54. int get_attr(void *);
  55. int fsm_error(unsigned char, void *);
  56. int fsm_conv(unsigned char, unsigned char, void *);
  57. int flush (void *);
  58. int dcp(void *);
  59. int dealloc(void *);
  60. int crtp(void *);
  61. int conv(void *);
  62. int chkparm(void *, void *);
  63. int check_end(unsigned int, void *);
  64. struct rqb *call_appl(void *);
  65. int buffmng(unsigned char, void *, void *, void *, unsigned, unsigned char, unsigned);
  66. unsigned long attltck(void *);
  67. unsigned long attacheck(void *);
  68. char *cgetmem(int, int);
  69. int sendhsf(void *);
  70. int opndst(void *);
  71. int alloc_rcb(void *, void *);
  72. int allocate(void *);
  73. int clsdst(void *);
  74. int pfmh7(void *);
  75.  
  76. phsrec(s_ptr)
  77. char *s_ptr;
  78. {
  79.     struct FMH7 *p_fmh7;
  80.     struct segprf *p_sp;
  81.     struct rqb *p_rqb;
  82.     struct lucb *p_lu;
  83.     struct scb *p_scb;
  84.     struct rpl *p_rpl;
  85.     struct rcb *p_rcb;
  86.     struct fmhcom *p_fmh;
  87.     unsigned char p;
  88.     unsigned char p1;
  89.     int i;
  90.  
  91. #if OS_TYPE == 1
  92. /*********  Trace facility **********/
  93. unsigned int rtype;   /* type of record */
  94. unsigned int pnum;    /* point number */
  95. char pname[8];        /* name of module */
  96. char *drec;       /* record for dump */
  97. int  lenr;            /* record length */
  98. rtype = INPROC;
  99. strcpy(pname, "phsrec");
  100. pnum = 1;
  101. drec = s_ptr;
  102. lenr = 200;
  103. gtf(rtype, pname, pnum, drec, lenr);
  104. /***********************************/
  105. #endif
  106.  
  107.     p_sp = (struct segprf *)s_ptr;
  108.     p_rqb = (char *)s_ptr + 12;
  109.  
  110.     /* Search for the SCB and the RCB for that request */
  111.  
  112.     p_lu = psp_ini.lucb_list_ptr;
  113.     p_scb = p_lu -> scb_list;
  114.     while (p_scb != NULL) {
  115.         if ((i = memcmp(p_rqb -> th.ra.wa.area, p_scb -> lu_name, 8)) == 0) {
  116.             break;
  117.         }
  118.         p_scb = p_scb -> next;
  119.     }
  120.     if (p_scb == NULL) {
  121.         return (-1); /* SCB not found! */
  122.     }
  123.  
  124.     if ((p_fmh = calloc(1, sizeof(struct fmhcom))) == NULL) {
  125.         return (-2); /* Can't allocate memory */
  126.     }
  127.     p_fmh7 = (char *)s_ptr + 31;
  128.     p_fmh -> ru = p_fmh7;
  129.     p_fmh -> lu_name = &((*p_rqb).th.ra.wa.area);
  130.     p_fmh -> p_scb = p_scb;
  131.     p = p_fmh7 -> type;
  132.     p = p & 0x7f;
  133.  
  134.     switch (p) {
  135.         case TYPE5 :
  136.                      {
  137.                         pfmh5(p_fmh);
  138.                         break;
  139.                      }
  140.         case TYPE7 :
  141.                      {
  142.                         pfmh7(p_fmh);
  143.                         break;
  144.                      }
  145.         default :
  146.                      {
  147.                         /* Invalid header */
  148.                         p_rcb = p_scb -> p_rcb;
  149.                         if (p_rcb != NULL) {
  150.                             p1 = ALLOC_FAIL_NO_RETRY;
  151.                             fsm_error(p1, p_rcb);
  152.                         }
  153.                         p_rpl = p_scb -> p_rpl;
  154.                         clsdst(p_rpl);
  155.                         free(p_rpl);
  156.                         p_scb -> p_rpl = NULL;
  157.                         p_scb -> p_rcb = NULL;
  158.                         p_scb -> use = FREE;
  159.                      }
  160.      }
  161.      free(p_fmh);
  162.      return (0);
  163. }
  164. int pfmh7(s_ptr)
  165. char *s_ptr;
  166. {
  167.     struct fmhcom *p_fmh;
  168.     struct FMH7 *p_fmh7;
  169.     struct scb *p_scb;
  170.     struct rcb *p_rcb;
  171.     struct lucb *p_lucb;
  172.     char p1;
  173.     unsigned long sense;
  174.  
  175.     p_fmh = (struct fmhcom *)s_ptr;
  176.     p_fmh7 = (struct FMH7 *)p_fmh -> ru;
  177.     p_scb = p_fmh -> p_scb;
  178.     p_lucb = psp_ini.lucb_list_ptr;
  179.     p_rcb = p_scb -> p_rcb;
  180.     if (p_rcb == NULL) {
  181.         return;
  182.     }
  183.     /*
  184.      * RCB has been found
  185.      */
  186. #if OS_TYPE == 0 /* MS-DOS */
  187.     post_rcb(p_rcb);  /* break out post state */
  188.     p1 = p_fmh7 -> sense[0];
  189.     p_fmh7 -> sense[0] = p_fmh7 -> sense[3];
  190.     p_fmh7 -> sense[3] = p1;
  191.     p1 = p_fmh7 -> sense[1];
  192.     p_fmh7 -> sense[1] = p_fmh7 -> sense[2];
  193.     p_fmh7 -> sense[2] = p1;
  194. #endif
  195.     memcpy(&sense, p_fmh7 -> sense, 4);
  196.         if((sense == 0x1008600b) ||
  197.            (sense == 0x08640000) ||
  198.            (sense == 0x08640001) ||
  199.            (sense == 0x08640002) ||
  200.            (sense == 0x08890000) ||
  201.            (sense == 0x08890001))
  202.                           {
  203.                             p1 = CONV_FAIL_PROTOCOL;
  204.                             fsm_error(p1, p_rcb);
  205.                             p_rcb -> sense = sense;
  206.                             goto pfmh_exit;
  207.                           }
  208.         if((sense == 0x10086041))
  209.                           {
  210.                             p1 = SYNC_LEVEL_NOT_SUPPTD;
  211.                             fsm_error(p1, p_rcb);
  212.                             goto pfmh_exit;
  213.                           }
  214.         if((sense == 0x10086021) ||
  215.            (sense == 0x10086031) ||
  216.            (sense == 0x10086032) ||
  217.            (sense == 0x084b6031))
  218.                           {
  219.                             p1 = ALLOC_FAIL_RETRY;
  220.                             fsm_error(p1, p_rcb);
  221.                             goto pfmh_exit;
  222.                           }
  223.         if((sense == 0x10086034) ||
  224.            (sense == 0x080f6051) ||
  225.            (sense == 0x084c0000))
  226.                           {
  227.                             p1 = ALLOC_FAIL_NO_RETRY;
  228.                             fsm_error(p1, p_rcb);
  229.                             goto pfmh_exit;
  230.                           }
  231.         p1 = CONV_FAIL_SON;
  232.         fsm_error(p1, p_rcb);
  233.  
  234.     pfmh_exit:
  235.            return 0;
  236. }
  237.